hhkb
레드팀

레드팀인프라구축_04_C2 서버 구축과 Sliver

작성자 : Heehyeon Yoo|2025-12-23
# RedTeam# C2# Sliver# Golang# Evasion

1. Sliver C2 프레임워크 개요

Sliver는 Golang으로 작성된 오픈소스 크로스 플랫폼 C2 프레임워크이다. Cobalt Strike의 강력한 대안으로 사용되며, 특히 바이너리 난독화와 네트워크 우회 기능이 뛰어나다.
C2 서버는 리다이렉터 뒷단에 숨어 있기 때문에, 리다이렉터로부터 넘어오는 트래픽만을 처리한다.

2. 환경 구축(Golang & 의존성)

Sliver를 소스코드 레벨에서 수정하고 컴파일하기 위해 특정 버전의 Go 언어 환경이 필요하다.

2.1 GVM(Go Version Manager)을 이용한 설치

Ubuntu 리포지토리의 Go 버전은 호환되지 않을 수 있으므로 GVM을 사용한다.

# 1. 필수 컴파일러 및 도구 설치
sudo apt install -y git build-essential mingw-w64 binutils-mingw-w64 g++-mingw-w64 bison

# 2. GVM 설치
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source /root/.gvm/scripts/gvm

# 3. Go 1.20.7 설치 및 활성화(Sliver 1.5.x 호환)
gvm install go1.20.7 -B
gvm use go1.20.7 --default

3. 정적 분석 우회(Static Evasion)

오픈소스 C2의 가장 큰 약점은 시그니처(Signature)가 이미 널리 알려져 있다는 점이다. 이를 해결하기 위해 소스코드를 무작위로 변형(Randomization/Obfuscation)하여 바이너리의 해시값과 내부 문자열을 완전히 바꾼다.

3.1 소스코드 수정 및 컴파일 절차

  1. 소스 다운로드:

    git clone https://github.com/BishopFox/sliver.git /opt/sliver
    cd /opt/sliver
    git checkout tags/v1.5.43  # 안정적인 버전 체크아웃
    
  2. 난독화 스크립트 실행(mod_sliver.py):

    • 역할: Sliver 소스코드 내의 함수명, 변수명, 로고 아스키 아트, 에러 메시지 등을 무작위 문자열로 치환한다.
    • 결과: 매 컴파일마다 전혀 다른 시그니처를 가진 바이너리가 생성되어, 백신(AV)의 정적 탐지를 우회한다.
    #(스크립트 준비 후)
    python3 mod_sliver.py
    
  3. 컴파일(Make):

    make pb    # Protocol Buffers 컴파일
    make       # Sliver Server & Client 최종 빌드
    

4. Malleable C2 와 네트워크 우회

Malleable C2는 C2 통신 트래픽의 모형(Profile)을 변형하는 기능이다.
기본 C2 트래픽은 특징적인 패턴(특정 헤더, 확장자 등)을 가지지만, 이를 수정하여 일반적인 웹 트래픽과 구분할 수 없게 만든다.

  • 설정 파일: sliver-server/assets/profiles/http-c2.json(위치 상이할 수 있음)을 수정하거나 새로 로드한다.
  • 동기화: 앞서 설정한 Redirector(Nginx)의 설정과 100% 일치해야 한다.
    • URL 경로(예: /login.php, /static/jquery.js)
    • User-Agent 문자열
    • HTTP 헤더 및 쿠키 포맷

5. 서버 실행 및 리스너 설정

  1. 서버 실행: ./sliver-server(관리자 권한 필요)
  2. 리스너 생성: 리다이렉터로부터 오는 HTTPS 트래픽을 수신할 리스너를 연다.
    sliver > https --lport 443
    
  3. Operator 설정(Multiplayer Mode):
    보안을 위해 로컬에서 직접 작업하지 않고, 오퍼레이터 접속용 프로필을 생성한다.
    sliver > new-operator --name choi --lhost [C2_Public_IP]
    
    생성된 설정 파일(.cfg)은 오퍼레이터 서버로 반출한다.